home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / dolmorph / src / fifo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-07  |  4.3 KB  |  230 lines

  1. /*
  2.     fifo.c
  3.  
  4. FIFOバッファ一般アルゴリズム
  5.  
  6.     fifo_new(data_size)
  7.     fifo_destroy(id)
  8.  
  9.     fifo_set(id, data)
  10.     fifo_get(id, data)
  11.     fifo_isEmpty(id)
  12.     fifo_getLeftNum(id)
  13.  
  14. リスト一般アルゴリズム
  15.  
  16.     LIST    *list_new(int size)
  17.     void    list_destroy(LIST *list)
  18.  
  19.     void    list_top(LIST *list)
  20.     void    list_next(LIST *list)
  21.     void    list_prev(LIST *list)
  22.     void    list_moveTo(LIST *list, int index)
  23.     int        list_getData(LIST *list, void *data)
  24.     int        list_setData(LIST *list, void *data)
  25.     int        list_insertData(LIST *list, void *data)
  26.     void    list_deleteData(LIST *list)
  27.  
  28.     int        list_isOut(LIST *list)
  29.     int        list_getDataNum(LIST *list)
  30.     int        list_isEmpty(LIST *list)
  31. */
  32.  
  33. #include <stdio.h>
  34. #include <stdlib.h>
  35. #include <winb.h>
  36. #include <te.h>
  37. #include <fntb.h>
  38. #include <gui.h>
  39. #include <memory.h>
  40.  
  41. #include "fifo.h"
  42.  
  43. FIFO    *fifo_new(int data_size)
  44. {
  45.     FIFO *fifo;
  46.     fifo = TL_calloc(1,sizeof(FIFO));
  47.     if (fifo == NULL)
  48.         return NULL;
  49.     fifo->data = TL_calloc(1000, data_size);
  50.     fifo->datanum = 0;
  51.     fifo->datasize = data_size;
  52.     return fifo;
  53. }
  54.  
  55. void    fifo_destroy(FIFO *fifo)
  56. {
  57.     TL_free(fifo->data);
  58.     TL_free(fifo);
  59. }
  60.  
  61. int        fifo_set(FIFO *fifo, void *data)
  62. {
  63.     char *p;
  64.     p = fifo->data + fifo->datasize*fifo->datanum;
  65.     memcpy(p, data, fifo->datasize);
  66.     fifo->datanum++;
  67.     return 0;
  68. }
  69.  
  70. int        fifo_get(FIFO *fifo, void *data)
  71. {
  72.     if (fifo->datanum <= 0)
  73.         return -1;
  74.     memcpy(data, fifo->data, fifo->datasize);
  75.     fifo->datanum--;
  76.     if (fifo->datanum > 0)
  77.         memcpy(fifo->data,fifo->data+fifo->datasize,
  78.                fifo->datanum*fifo->datasize);
  79.     return 0;
  80. }
  81.  
  82. int        fifo_isEmpty(FIFO *fifo)
  83. {
  84.     if (fifo->datanum <= 0)
  85.         return 1;
  86.     else
  87.         return 0;
  88. }
  89.  
  90. int        fifo_getLeftNum(FIFO *fifo)
  91. {
  92.     return fifo->datanum;
  93. }
  94.  
  95. /*--------------------------------------------------------*/
  96. /*                       リスト一般                       */
  97. /*--------------------------------------------------------*/
  98.  
  99. LIST    *list_new(int size)
  100. {
  101.     LIST *list;
  102.     list = TL_calloc(1,sizeof(LIST)+sizeof(LISTE));
  103.     if (list == NULL)
  104.         return NULL;
  105.     list->datanum = 0;
  106.     list->datasize = size;
  107.     list->outdata = (LISTE*)(list+1);
  108.     list->cur = list->outdata;
  109.     list->outdata->prev = list->outdata->next = list->outdata;
  110.     list->pos = 0;
  111.     return list;
  112. }
  113.  
  114. void    list_destroy(LIST *list)
  115. {
  116.     TL_free(list);
  117. }
  118.  
  119. void    list_top(LIST *list)
  120. {
  121.     if (list->datanum <= 0)
  122.         return;
  123.     list->cur = list->outdata->next;
  124.     list->pos = 0;
  125. }
  126.  
  127. void    list_next(LIST *list)
  128. {
  129.     if (list->pos >= list->datanum)
  130.         return;
  131.     list->pos++;
  132.     list->cur = list->cur->next;
  133. }
  134.  
  135. void    list_prev(LIST *list)
  136. {
  137.     if (list->pos < 0)
  138.         return;
  139.     list->pos--;
  140.     list->cur = list->cur->prev;
  141. }
  142.  
  143. void    list_moveTo(LIST *list, int index)
  144. {
  145.     int i;
  146.     i = index - list->pos;
  147.     for (;i>0;i--)
  148.         list_next(list);
  149.     for (;i<0;i++)
  150.         list_prev(list);
  151. }
  152.  
  153. int        list_getData(LIST *list, void *data)
  154. {
  155.     if (list->pos < 0 || list->datanum <= list->pos)
  156.         return -1;
  157.     memcpy(data, list->cur+1, list->datasize);
  158.     return 0;
  159. }
  160.  
  161. int        list_setData(LIST *list, void *data)
  162. {
  163.     if (list->pos < 0 || list->datanum <= list->pos)
  164.         return -1;
  165.     memcpy(list->cur+1, data, list->datasize);
  166.     return 0;
  167. }
  168.  
  169. int        list_insertData(LIST *list, void *data)
  170. {
  171.     LISTE *le;
  172.     if (list->pos < 0)
  173.         return -1;
  174.     le = TL_calloc(1, sizeof(LISTE) + list->datasize);
  175.     if (le == NULL)
  176.         return -1;
  177.     memcpy(le+1,data,list->datasize);
  178.     /*
  179.         旧:    □            →    □        →        □
  180.                 cur->prev    ←    cur        ←        cur->next
  181.             
  182.         新:    □            →    □        →        □        →        □
  183.                 cur->prev    ←    le        ←        cur        ←        cur->next
  184.                                 (cur->prev)        (cur)            (cur->next)
  185.     */
  186.     le->next = list->cur;
  187.     le->prev = list->cur->prev;
  188.     list->cur->prev->next = le;
  189.     list->cur->prev = le;
  190.     list->pos++;
  191.     list->datanum++;
  192.     return 0;
  193. }
  194.  
  195. int        list_deleteData(LIST *list)
  196. {
  197.     LISTE *e;
  198.     if (list->pos < 0 || list->datanum <= list->pos)
  199.         return -1;
  200.     list->cur->prev->next = list->cur->next;
  201.     list->cur->next->prev = list->cur->prev;
  202.     e = list->cur;
  203.     list->cur = list->cur->next;
  204.     TL_free(e);
  205.     list->datanum--;
  206.     return 0;
  207. }
  208.  
  209. int        list_isOut(LIST *list)
  210. {
  211.     if (list->pos < 0 || list->datanum <= list->pos)
  212.         return 1;
  213.     else
  214.         return 0;
  215. }
  216.  
  217. int        list_getDataNum(LIST *list)
  218. {
  219.     return list->datanum;
  220. }
  221.  
  222. int        list_isEmpty(LIST *list)
  223. {
  224.     if (list->datanum == 0)
  225.         return 1;
  226.     else
  227.         return 0;
  228. }
  229.  
  230.